module.exports = app => {
  app.use(async (ctx, next) => {
    if (!ctx.context.asset) {
      const config = ctx.context.config;
      const asset = '../asset.json';
      ctx.context.asset = resolveAsset(require(asset), config.theme);
    }
    await next();
  });
};

// 合并相应的chunk资源，传递到模版中使用
function resolveAsset(assetData, theme) {
  let resolved = {};

  // 参数可以传递数据方式或者连续传参方式
  return (...args) => {
    if (!assetData) {
      return;
    }

    // 对传参进行处理，如果传递是数组将第一个数组返回否则直接返回参数数组
    args = Array.isArray(args[0]) ? args[0] : args;
    args = ['vendor'].concat(args);

    const key = args.join('_');

    // 如果已经存在直接返回
    if (resolved[key]) {
      return resolved[key];
    }
    let result = {};

    args.forEach((name) => {
      // 将assetData数据的键名与asset保持一致
      if (!/vendor/.test(name)) {
        name = `entry.${name}`;
        name = `js/${theme ? theme + '/' : ''}${name}`;
      }
      let files = assetData[name];
      for (let i in files) {
        if (!result.hasOwnProperty(i)) {
          result[i] = [];
        }

        if (files[i]) {
          // 替换掉map中path中的static
          let filepath = files[i];
          result[i] = result[i].concat(filepath);
        }
      }
    });
    return resolved[key] = result;
  };
}
